package main

import (
	"fmt"
	"strings"
)

/*
翻转字符串里的单词
给定一个字符串，逐个翻转字符串中的每个单词。

说明：
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。

示例 1：
输入："the sky is blue"
输出："blue is sky the"
示例 2：
输入："  hello world!  "
输出："world! hello"
 */
/*
	双指针
  算法解析：
倒序遍历字符串 ss ，记录单词左右索引边界 i , j；
每确定一个单词的边界，则将其添加至单词列表 resres ；
最终，将单词列表拼接为字符串，并返回即可。
*/

func reverseWords(s string) string {
	res := make([]string, 0)
	ss := strings.TrimSpace(s)
	i, j := len(ss) - 1, len(ss) - 1
	for i >= 0 {
		for i >= 0 && ss[i] != ' ' {
			i --
		}
		res = append(res, ss[i + 1: j + 1])
		for i >= 0 && ss[i] == ' ' {
			i --
		}
		j = i
	}
	resString := strings.Join(res, " ")
	return resString
}

func main() {
	fmt.Println(reverseWords("    hello     world!"))
}
